home *** CD-ROM | disk | FTP | other *** search
/ Java Developer's Companion / Java Developer's Companion.iso / Javacup / IN231VFD.TAR / internet / IN231VFD / Agent.java < prev    next >
Text File  |  1996-05-21  |  8KB  |  288 lines

  1. //    Agent.java - Main CyberAgent program
  2. //
  3. //    Copyright (C) 1996 by Dale Gass
  4. //    Non-exclusive license granted to MKS, Inc.
  5. //
  6.  
  7. import java.lang.*;
  8. import java.util.*;
  9. import java.awt.*;
  10. import java.net.*;
  11. import java.applet.*;
  12.  
  13. // A status indicator which shows the current state of the program.
  14.  
  15. class Status extends Label implements Runnable {
  16.     final static int listing = 0;
  17.     final static int layout  = 1;
  18.     final static int loading = 2;
  19.     final static int camera  = 3;
  20.  
  21.     Thread blinker;
  22.     int which;
  23.  
  24.     final static String text[] = {
  25. "Please select one of the above listings",
  26. "Please select one of the floor layouts below",
  27. "Loading floor plans, please wait...",
  28. "Please select one of the blue cameras"
  29.     };
  30.  
  31.     // Set current status
  32.  
  33.     public void setState(int which_) {
  34.         which = which_;
  35.         blinker.stop();
  36.         setText(text[which]);
  37.     }
  38.  
  39.     // Set blinking attribute
  40.  
  41.     public void setBlink(boolean state) {
  42.     if (state == true) {
  43.         blinker.start();
  44.     } else {
  45.         blinker.stop();
  46.         setText(text[which]);
  47.     }
  48.     }
  49.  
  50.     // Do any blinking required
  51.  
  52.     public void run() {
  53.         while (true) {
  54.         setText(text[which]);
  55.         try { blinker.sleep(500); } catch (Exception e) { }
  56.         setText("");
  57.         try { blinker.sleep(500); } catch (Exception e) { }
  58.     }
  59.     }
  60.  
  61.     // Status() constructor with initial state
  62.  
  63.     public Status(int initial) {
  64.     setAlignment(Label.CENTER);
  65.     setFont(new Font("Helvetica", Font.BOLD, 24));
  66.     blinker = new Thread(this);
  67.         setState(initial);
  68.     }
  69. }
  70.  
  71. // Agent - Main program applet class
  72.  
  73. public class Agent extends Applet {
  74.     HouseServer server = new HouseServer();    // Our server connection
  75.     LabList price, area, beds, match;        // Listboxes for selection
  76.     PackerLayout toppack;            // Top level layout
  77.     Vector matchesV;                // Vector of matching houses
  78.     Panel work;                    // Main working area
  79.     CardLayout worklayout;            // Card stack for working area
  80.     CheckboxGroup cg = new CheckboxGroup();    // Group for floor selection
  81.     Checkbox mort, floors[];            // Checkboxes for floor select
  82.     HouseView plans[];                // Loaded floor plans
  83.     Mort mortCalc;                // The mortgage calculator
  84.     Status instruct;                // Status and advistory text
  85.  
  86.     // Disable floor plan views
  87.  
  88.     void disableViews() {
  89.         worklayout.show(work, "mort");
  90.         mort.setState(true);
  91.         for (int i=0; i<3; i++)
  92.         floors[i].disable();
  93.     }
  94.  
  95.     // Perform a server query
  96.  
  97.     synchronized void doQuery() {
  98.         disableViews();
  99.     matchesV = server.query(price.list.getSelectedIndexes(),
  100.                 area .list.getSelectedIndexes(),
  101.                 beds .list.getSelectedIndexes());
  102.  
  103. //    match.list.clear();    // This is broken in Win JDK Beta 2
  104.     match.list.delItems(0, match.list.countItems()-1);
  105.     instruct.setState(Status.listing);
  106.  
  107.     Enumeration e = matchesV.elements();
  108.     while (e.hasMoreElements()) {
  109.         House h = (House) e.nextElement();
  110.         match.list.addItem(h.toString());
  111.     }
  112.     }
  113.  
  114.     // Find the currently selected house
  115.  
  116.     House selectedHouse() {
  117.         int i = match.list.getSelectedIndex();
  118.     if (i == -1)
  119.         return (null);
  120.     return (House) matchesV.elementAt(i);
  121.     }
  122.  
  123.     // Action upon picking one of the matching listings
  124.  
  125.     synchronized void doPick()
  126.     {
  127.         House h = selectedHouse();
  128.     if (plans == null)
  129.         plans = new HouseView[3];
  130.  
  131.     mortCalc.setAmount(h.getPrice());
  132.     if (h.hasView()) {
  133.         instruct.setState(Status.loading);
  134.         instruct.setBlink(true);
  135.         new Sound(Sound.drip);
  136.         for (int i=0; i<3; i++) {
  137.         if (plans[i] != null)
  138.             work.remove(plans[i]);
  139.         work.add("floor" + i, plans[i] = new HouseView(this, h, i));
  140.             floors[i].enable();
  141.         }
  142.         floors[1].setState(true);
  143.         worklayout.show(work, "floor1");
  144.         instruct.setState(Status.camera);
  145.     } else {
  146.         new Sound(Sound.doh);
  147.         disableViews();
  148.         instruct.setState(Status.listing);
  149.     }
  150.     }
  151.  
  152.     // Action upon selecting the mort. calc. or one of the floor plans
  153.  
  154.     void doView() {
  155.         if (cg.getCurrent() == mort)
  156.         worklayout.show(work, "mort");
  157.         else if (cg.getCurrent() == floors[0])
  158.         worklayout.show(work, "floor0");
  159.         else if (cg.getCurrent() == floors[1])
  160.         worklayout.show(work, "floor1");
  161.         else if (cg.getCurrent() == floors[2])
  162.         worklayout.show(work, "floor2");
  163.     if (cg.getCurrent() == mort)
  164.         instruct.setState(Status.layout);
  165.     else
  166.         instruct.setState(Status.camera);
  167.     }
  168.  
  169.     // Main program event handler
  170.  
  171.     public boolean handleEvent(Event evt) {
  172.         switch(evt.id) {
  173.  
  174.     case Event.LIST_SELECT:
  175.         if (evt.target == match.list) {
  176.         doPick();
  177.         return true;
  178.         }
  179.         /* Fall through */
  180.  
  181.     case Event.LIST_DESELECT:
  182.         if (evt.target == price.list || 
  183.             evt.target == area.list || 
  184.         evt.target == beds.list) {
  185.             doQuery();
  186.             return true;
  187.         }
  188.         break;
  189.  
  190.     case Event.ACTION_EVENT:
  191.         if (evt.target instanceof Checkbox) {
  192.         doView();
  193.         return true;
  194.         }
  195.         break;
  196.  
  197. //    Key events don't seem reliable; not implemented yet...
  198. //    case Event.KEY_PRESS:
  199. //    case Event.KEY_RELEASE:
  200. //    case Event.KEY_ACTION:
  201. //    case Event.KEY_ACTION_RELEASE:
  202. //        System.out.println(evt);
  203. //        break;
  204.     }
  205.  
  206.     return false;
  207.     }
  208.  
  209.     // Main applet initialization - build the top-level U.I., etc.
  210.  
  211.     public void init() { 
  212.  
  213.     Sound.init(this);
  214.     setLayout(toppack = new PackerLayout());
  215.  
  216.     setFont(new Font("TimeRoman", Font.BOLD, 14));
  217.  
  218.     Panel p = new Panel();
  219.     p.add(new DynaLabel("CyberAgent"));
  220.  
  221.     add("title;side=top", p);
  222.     add("clock;side=top", new Clock());
  223.     add("instruct;side=top", 
  224.         new Label("Please select search criteria below:"));
  225.  
  226.     Panel crit = new Panel();
  227.     crit.setLayout(new PackerLayout());
  228.     crit.add("price;side=left", price = new LabList("&Price:"   , 5, true));
  229.     crit.add("area;side=left",  area  = new LabList("&Area:"    , 5, true));
  230.     crit.add("beds;side=left",  beds  = new LabList("&Bedrooms:", 5, true));
  231.  
  232.     crit.add("sign;side=left", new Sign(this, new Dimension(200,160), 
  233.         "sign", 10));
  234.  
  235.     add("criteria;side=top", crit);
  236.  
  237.     add("matches;side=top;fill=x",     
  238.         match = new LabList("Listings &matching selected criteria:",
  239.         5, false));
  240.  
  241.     add("instruct;side=top;fill=x", instruct = new Status(Status.listing));
  242.  
  243.     Panel pick = new Panel();
  244.     pick.setLayout(new PackerLayout());
  245.  
  246.     floors = new Checkbox[3];
  247.  
  248.     mort      = new Checkbox("Mortgage Calculator", cg, false);
  249.     floors[0] = new Checkbox("Basement plan",       cg, false);
  250.     floors[1] = new Checkbox("Main floor plan",     cg, false);
  251.     floors[2] = new Checkbox("Upstairs plan",       cg, false);
  252.  
  253.     pick.add("radio1;side=left", mort);
  254.     pick.add("radio2;side=left", floors[0]);
  255.     pick.add("radio3;side=left", floors[1]);
  256.     pick.add("radio4;side=left", floors[2]);
  257.  
  258.     add("pick;side=top", pick);
  259.  
  260.     add("work;side=top", work = new Panel());
  261.     work.setLayout(worklayout = new CardLayout());
  262.  
  263.     work.add("mort", mortCalc = new Mort());
  264.     work.resize(600, 350);
  265.  
  266.     mort.setState(true);
  267.  
  268.     price.addItems(server.enumPrices());
  269.     area .addItems(server.enumAreas ());
  270.     beds .addItems(server.enumBeds  ());
  271.     price.selectAll();
  272.     area .selectAll();
  273.     beds .selectAll();
  274.  
  275.     doQuery();
  276.     }
  277.  
  278.     public void start() {
  279.         new Sound(Sound.hey);    // Startup sound
  280.     show();
  281.     }
  282.  
  283.     public void stop() {
  284.         new Sound(Sound.out);    // Termination sound
  285.         hide();
  286.     }
  287. }
  288.